// 包含必要的头文件
#include "rclcpp/rclcpp.hpp"          // ROS2的C++核心库
#include "std_msgs/msg/string.hpp"    // 字符串消息类型
#include <chrono>                     // 时间库

// 使用命名空间，避免重复写std::chrono_literals
using namespace std::chrono_literals;

// 创建Talker类，继承自rclcpp::Node
class Talker : public rclcpp::Node
{
public:
    // 构造函数
    Talker() : Node("talker_node")  // 节点名称为"talker_node"
    {
        // 创建发布者，发布到"chat_topic"话题，队列大小为10
        publisher_ = this->create_publisher<std_msgs::msg::String>("chat_topic", 10);
        
        // 创建定时器，每秒触发一次
        timer_ = this->create_wall_timer(
            1000ms, // 1000毫秒 = 1秒
            std::bind(&Talker::timer_callback, this) // 绑定回调函数
        );
        
        // 打印启动信息
        RCLCPP_INFO(this->get_logger(), "Talker节点启动成功！");
    }

private:
    // 定时器回调函数
    void timer_callback()
    {
        // 创建消息对象
        auto message = std_msgs::msg::String();
        
        // 设置消息内容
        message.data = "Hello World!";
        
        // 发布消息
        publisher_->publish(message);
        
        // 打印发送的信息
        RCLCPP_INFO(this->get_logger(), "发送消息: '%s'", message.data.c_str());
    }
    
    // 声明成员变量
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;  // 发布者
    rclcpp::TimerBase::SharedPtr timer_;  // 定时器
};

// 主函数
int main(int argc, char * argv[])
{
    // 初始化ROS2
    rclcpp::init(argc, argv);
    
    // 创建节点并保持运行
    auto node = std::make_shared<Talker>();
    rclcpp::spin(node);
    
    // 关闭ROS2
    rclcpp::shutdown();
    return 0;
}